Entity Relationships হল JPA (Java Persistence API) এর একটি মৌলিক ধারণা, যা Entity গুলির মধ্যে সম্পর্ক নির্ধারণ করে। Spring Boot JPA-তে Entity Relationship-কে বিভিন্ন উপায়ে মডেল করা হয় যেমন One-to-One, One-to-Many, এবং Many-to-Many। এই সম্পর্কগুলোর মাধ্যমে আপনি বিভিন্ন Entity এর মধ্যে সম্পর্ক তৈরি এবং পরিচালনা করতে পারেন।
এখানে One-to-One, One-to-Many, এবং Many-to-Many সম্পর্কের ব্যবহার এবং তাদের Spring Boot JPA-তে বাস্তবায়নের উদাহরণ দেওয়া হচ্ছে।
1. One-to-One Relationship
One-to-One Relationship যখন দুটি Entity-এর মধ্যে একে অপরের সাথে একটি একক সম্পর্ক থাকে, যেমন একজন Person এর একটি Passport থাকতে পারে এবং একটি Passport শুধুমাত্র এক Person এর সাথে সম্পর্কিত থাকে।
উদাহরণ:
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "passport_id")
private Passport passport;
// Getters and Setters
}
@Entity
public class Passport {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String number;
@OneToOne(mappedBy = "passport")
private Person person;
// Getters and Setters
}
এখানে, Person এবং Passport এর মধ্যে One-to-One সম্পর্ক স্থাপন করা হয়েছে। @OneToOne অ্যানোটেশন ব্যবহার করে আমরা সম্পর্কটি সংজ্ঞায়িত করেছি। CascadeType.ALL দ্বারা নিশ্চিত করা হয়েছে যে Person Entity-এর সব অপারেশন (save, delete) Passport Entity-তেও প্রভাব ফেলবে।
Cascade:
- CascadeType.ALL: সকল অপারেশন (SAVE, DELETE) এক Entity থেকে অন্য Entity তে প্রয়োগ হবে।
- mappedBy: এটি দ্বিতীয় Entity-এর দিকে সম্পর্কের মালিকানা নির্ধারণ করে, যাতে দুইটি Entity একে অপরের সাথে যুক্ত থাকে।
2. One-to-Many Relationship
One-to-Many Relationship যখন একটি Entity অনেক গুলো Entity এর সাথে সম্পর্কিত থাকে, যেমন একটি Department এর অনেকগুলো Employee থাকতে পারে, কিন্তু একটি Employee শুধুমাত্র একটি Department এর সাথে সম্পর্কিত।
উদাহরণ:
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
private List<Employee> employees;
// Getters and Setters
}
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
// Getters and Setters
}
এখানে, Department এবং Employee এর মধ্যে One-to-Many সম্পর্ক স্থাপন করা হয়েছে।
@OneToManyঅ্যানোটেশন ব্যবহার করে একটিDepartmentEntity অনেক গুলোEmployeeEntity-র সাথে সম্পর্কিত।mappedByদ্বারাEmployeeEntity-কে সম্পর্কের মালিক হিসেবে চিহ্নিত করা হয়েছে।@ManyToOneব্যবহার করেEmployeeEntity-এর দিকে সম্পর্কের মালিকানা নির্দেশ করা হয়েছে।
Cascade:
- CascadeType.ALL ব্যবহার করলে
DepartmentEntity-এর পরিবর্তনগুলিEmployeeEntity-তে প্রভাব ফেলবে, যেমন যদিDepartmentEntity-এ কোনো পরিবর্তন হয়, তবে সংশ্লিষ্ট সমস্তEmployeeEntity আপডেট হবে।
3. Many-to-Many Relationship
Many-to-Many Relationship যখন দুটি Entity একে অপরের সাথে অনেক সম্পর্ক তৈরি করে, যেমন Student এবং Course এর মধ্যে অনেক Student একাধিক Course নিতে পারে এবং একাধিক Student একাধিক Course তে অংশগ্রহণ করতে পারে।
উদাহরণ:
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany
@JoinTable(
name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id"))
private List<Course> courses;
// Getters and Setters
}
@Entity
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany(mappedBy = "courses")
private List<Student> students;
// Getters and Setters
}
এখানে, Student এবং Course Entity-র মধ্যে Many-to-Many সম্পর্ক স্থাপন করা হয়েছে।
@ManyToManyঅ্যানোটেশন ব্যবহার করে, দুটি Entity একে অপরের সাথে সম্পর্কিত।@JoinTableঅ্যানোটেশন ব্যবহার করে একটি সহায়ক টেবিল তৈরি করা হয় (এখানেstudent_course), যাতে দুইটি Entity-র মধ্যে সম্পর্ক বজায় থাকে।mappedByব্যবহার করা হয়েছেCourseEntity-এ, যা নির্ধারণ করে যেStudentEntity সম্পর্কের মালিক।
Cascade এবং Fetch Type Configuration
Spring JPA-তে Entity Relationships ম্যানেজ করার সময় Cascade এবং FetchType কনফিগারেশন গুরুত্বপূর্ণ ভূমিকা পালন করে।
1. Cascade Types
- CascadeType.ALL: সমস্ত অপারেশন (save, delete, update) Cascade করা হয়।
- CascadeType.PERSIST: শুধু
saveঅপারেশন Cascade হয়। - CascadeType.MERGE:
updateঅপারেশন Cascade হয়। - CascadeType.REMOVE:
deleteঅপারেশন Cascade হয়। - CascadeType.REFRESH:
refreshঅপারেশন Cascade হয়।
2. Fetch Types
- EAGER: সম্পর্কিত Entity গুলি তখনই লোড হবে যখন প্রধান Entity লোড হবে।
- LAZY: সম্পর্কিত Entity গুলি প্রধান Entity লোড করার পর সেগুলোর উপর অ্যাক্সেস করলে লোড হবে।
সারাংশ
- One-to-One: দুটি Entity একে অপরের সাথে একক সম্পর্কিত হয়। এটি
@OneToOneঅ্যানোটেশন ব্যবহার করে তৈরি করা হয়। - One-to-Many: একটি Entity অনেক Entity-এর সাথে সম্পর্কিত থাকে। এটি
@OneToManyএবং@ManyToOneব্যবহার করে তৈরি হয়। - Many-to-Many: দুটি Entity একে অপরের সাথে অনেক সম্পর্ক তৈরি করে। এটি
@ManyToManyব্যবহার করে তৈরি করা হয়।
Spring JPA আপনাকে এই সম্পর্কগুলোর মধ্যে ডেটা ব্যবস্থাপনা এবং কার্যকরীভাবে সম্পর্ক স্থাপন করতে সাহায্য করে, যা ডেটাবেসের রিলেশনাল নকশাকে অবজেক্ট-অরিয়েন্টেড ডিজাইনে রূপান্তর করে।
Spring Boot JPA (Java Persistence API) হল একটি প্রযুক্তি যা Java অ্যাপ্লিকেশনগুলিতে ডেটাবেস অপারেশন সহজ এবং কার্যকর করতে ব্যবহৃত হয়। JPA অ্যাপ্লিকেশন ডেভেলপমেন্টের জন্য একটি স্ট্যান্ডার্ড API যা ডেটাবেস টেবিল এবং Java অবজেক্টের মধ্যে সম্পর্ক তৈরি করতে সাহায্য করে।
Entity Relationship (ER) হল এক ধরনের সম্পর্ক যা JPA এবং Hibernate-এ Entity গুলির মধ্যে সংযোগ নির্ধারণ করে। Entity Relationship-এর মাধ্যমে আমরা ডেটাবেসের টেবিলগুলোর মধ্যে সম্পর্ক যেমন One-to-One, One-to-Many, Many-to-One, এবং Many-to-Many তৈরি করতে পারি। Entity গুলি হল JPA-তে ডেটাবেস টেবিলের Java ক্লাস, এবং সম্পর্কগুলি জাভা অবজেক্টগুলির মধ্যে সংযোগ তৈরি করতে ব্যবহৃত হয়।
এই টিউটোরিয়ালে আমরা Spring Boot JPA-এ Entity Relationship-এর ধারণা এবং বিভিন্ন ধরনের সম্পর্ক গঠন করার উদাহরণ দেখব।
Entity Relationship-এর ধরন
Entity Relationship তৈরি করতে JPA annotations ব্যবহৃত হয়, যা Entity গুলির মধ্যে বিভিন্ন ধরনের সম্পর্ক কনফিগার করতে সাহায্য করে। আমরা সাধারণত @OneToOne, @OneToMany, @ManyToOne, এবং @ManyToMany অ্যানোটেশনগুলো ব্যবহার করি।
১. One-to-One Relationship (এক-এক সম্পর্ক)
One-to-One সম্পর্কের মধ্যে একটি Entity আরেকটি Entity-এর সাথে সম্পর্কিত থাকে, যেখানে এক Entity-এর একটি ইনস্ট্যান্স আরেকটি Entity-এর একটি ইনস্ট্যান্সের সাথে সম্পর্কিত থাকে।
উদাহরণ: One-to-One Relationship
ধরা যাক, একটি Person Entity এবং একটি Passport Entity রয়েছে। প্রতিটি ব্যক্তি একটি করে পাসপোর্ট পাবে, এবং প্রতিটি পাসপোর্ট শুধুমাত্র একটি ব্যক্তির সাথে সম্পর্কিত হবে।
import javax.persistence.*;
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne(mappedBy = "person")
private Passport passport;
// Getters and Setters
}
@Entity
public class Passport {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String passportNumber;
@OneToOne
@JoinColumn(name = "person_id")
private Person person;
// Getters and Setters
}
এখানে:
PersonEntity এবংPassportEntity এর মধ্যে One-to-One সম্পর্ক প্রতিষ্ঠিত হয়েছে।@OneToOneএবং@JoinColumnঅ্যানোটেশন ব্যবহার করা হয়েছে, যেখানেpassportফিল্ডটিPersonএর সঙ্গে সম্পর্কিত।
২. One-to-Many Relationship (এক-অনেক সম্পর্ক)
One-to-Many সম্পর্কের মধ্যে একটি Entity অনেক Entity-র সাথে সম্পর্কিত থাকে। এটি সাধারণত একটি Entity-এর একাধিক সম্পর্কিত অবজেক্টের তালিকা হিসেবে দেখা যায়।
উদাহরণ: One-to-Many Relationship
ধরা যাক, একটি Department Entity এবং একাধিক Employee Entity রয়েছে। এক বিভাগে অনেক কর্মচারী থাকতে পারে।
import javax.persistence.*;
import java.util.List;
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "department")
private List<Employee> employees;
// Getters and Setters
}
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
// Getters and Setters
}
এখানে:
DepartmentEntity এবংEmployeeEntity এর মধ্যে One-to-Many সম্পর্ক তৈরি হয়েছে।@OneToManyএবং@ManyToOneঅ্যানোটেশন ব্যবহার করা হয়েছে।EmployeeEntity-তে@ManyToOneএর মাধ্যমে সম্পর্ক প্রতিষ্ঠিত হয়েছে, এবংDepartmentEntity-তে@OneToManyএর মাধ্যমে কর্মচারী-দের তালিকা রাখা হয়েছে।
৩. Many-to-One Relationship (অনেক-এক সম্পর্ক)
Many-to-One সম্পর্কের মধ্যে অনেক Entity একটি একক Entity-র সাথে সম্পর্কিত থাকে। এটি One-to-Many সম্পর্কের বিপরীত।
উদাহরণ: Many-to-One Relationship
ধরা যাক, একাধিক Employee Entity একটি Company Entity-র সাথে সম্পর্কিত।
import javax.persistence.*;
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "company_id")
private Company company;
// Getters and Setters
}
@Entity
public class Company {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Getters and Setters
}
এখানে:
EmployeeEntity এবংCompanyEntity এর মধ্যে Many-to-One সম্পর্ক তৈরি হয়েছে।@ManyToOneঅ্যানোটেশন ব্যবহার করে অনেকEmployeeএকটিCompany-র সঙ্গে সম্পর্কিত।
৪. Many-to-Many Relationship (অনেক-অনেক সম্পর্ক)
Many-to-Many সম্পর্কের মধ্যে একাধিক Entity অন্য একাধিক Entity-র সাথে সম্পর্কিত থাকে। এটি দুইটি Entity-এর মধ্যে সম্পর্ক তৈরির ক্ষেত্রে ব্যবহৃত হয়, যেখানে একটি Entity-এর একাধিক ইনস্ট্যান্স অন্য Entity-এর একাধিক ইনস্ট্যান্সের সাথে সম্পর্কিত থাকে।
উদাহরণ: Many-to-Many Relationship
ধরা যাক, Student Entity এবং Course Entity রয়েছে, যেখানে একাধিক ছাত্র একাধিক কোর্সে অংশগ্রহণ করতে পারে এবং প্রতিটি কোর্সে অনেক ছাত্র থাকতে পারে।
import javax.persistence.*;
import java.util.Set;
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany
@JoinTable(
name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id")
)
private Set<Course> courses;
// Getters and Setters
}
@Entity
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String courseName;
@ManyToMany(mappedBy = "courses")
private Set<Student> students;
// Getters and Setters
}
এখানে:
StudentEntity এবংCourseEntity এর মধ্যে Many-to-Many সম্পর্ক তৈরি হয়েছে।@ManyToManyঅ্যানোটেশন এবং@JoinTableব্যবহার করে একটি জেনারেল টেবিল তৈরি করা হয়েছে যাstudent_courseনামে সম্পর্কিত।
Entity Relationship এর গুরুত্ব
- ডেটা মডেলিং: Entity Relationship ডেটাবেসের টেবিলগুলির মধ্যে সম্পর্ক তৈরির মাধ্যমে ডেটা মডেলিং সহজ করে। এটি ডেটাবেস ডিজাইনের জন্য একটি পরিষ্কার কাঠামো প্রদান করে।
- ডেটাবেস অপারেশন সহজীকরণ: Spring JPA এবং Hibernate ব্যবহার করে Entity Relationship-এর মাধ্যমে CRUD অপারেশন খুব সহজে করা যায়, কারণ Spring ORM (Object-Relational Mapping) ডাটাবেসের সঙ্গেও সম্পর্কিত ডেটার উপর কাজ করে।
- ডাটাবেসের মধ্যে ডেটা ইন্টিগ্রিটি: Entity Relationship সঠিকভাবে তৈরি করলে ডেটাবেসের মধ্যে ডেটা ইন্টিগ্রিটি বজায় থাকে। যেমন, Cascade অপারেশন ব্যবহারের মাধ্যমে সম্পর্কিত Entity গুলি একসঙ্গে আপডেট বা ডিলিট করা যায়।
- কোডের পুনঃব্যবহারযোগ্যতা: Entity Relationship ব্যবহারের মাধ্যমে একটি Entity অনেক জায়গায় পুনঃব্যবহার করা যায়, এবং কোডের কার্যকারিতা বজায় থাকে।
উপসংহার
Spring Boot JPA এবং Entity Relationship এর মাধ্যমে Java অ্যাপ্লিকেশনগুলোতে ডেটাবেসের টেবিলগুলির মধ্যে সম্পর্ক তৈরি করা সহজ এবং কার্যকরী হয়। One-to-One, One-to-Many, Many-to-One, এবং Many-to-Many সম্পর্কগুলির মাধ্যমে ডেটা মডেলিং এবং ডেটাবেসের কার্যকারিতা অনেক বৃদ্ধি পায়। Entity Relationship এবং Spring Data JPA ব্যবহার করে ডেটাবেসে দ্রুত CRUD অপারেশন সম্পাদন করা সম্ভব হয়, যা Java অ্যাপ্লিকেশনকে আরও স্কেলেবল এবং রক্ষণাবেক্ষণযোগ্য করে তোলে।
স্প্রিং বুট জেপিএ (Spring Boot JPA) হল একটি শক্তিশালী ফ্রেমওয়ার্ক যা ডাটাবেস সম্পর্ক (relationship) ম্যানেজ করতে সাহায্য করে। JPA আপনাকে বিভিন্ন ধরনের সম্পর্ক তৈরি করতে দেয়, যেমন One-to-One, One-to-Many, এবং Many-to-Many। এই সম্পর্কগুলো ডাটাবেস টেবিলগুলোর মধ্যে বিভিন্ন ধরনের সম্পর্ক নির্ধারণ করে এবং JPA অ্যানোটেশন যেমন @OneToOne, @OneToMany, এবং @ManyToMany এর মাধ্যমে এটি সহজেই পরিচালনা করা যায়।
নিচে প্রতিটি সম্পর্কের জন্য বিস্তারিত আলোচনা এবং ব্যবহার উদাহরণ দেয়া হলো।
১. @OneToOne সম্পর্ক
@OneToOne সম্পর্ক তখন ব্যবহৃত হয় যখন একটি Entity অন্য একটি Entity-র সাথে একটি একক সম্পর্ক ভাগ করে। এক্ষেত্রে, দুটি Entity একে অপরের সাথে একেকটি রেকর্ডের মধ্যে সম্পর্কিত থাকে। এটি সাধারণত foreign key সম্পর্কের মাধ্যমে তৈরি হয়।
উদাহরণ:
ধরা যাক, Person এবং Passport দুটি Entity ক্লাস রয়েছে, যেখানে প্রতিটি Person-এর একটি Passport থাকে এবং একে অপরের সাথে একক সম্পর্ক ভাগ করে।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity
public class Person {
@Id
private Long id;
private String name;
@OneToOne
private Passport passport;
// getters and setters
}
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Passport {
@Id
private Long id;
private String passportNumber;
// getters and setters
}
এখানে, Person Entity এর মধ্যে passport একটি @OneToOne সম্পর্ক, যা Passport Entity এর সাথে একটি একক সম্পর্ক তৈরি করেছে।
ডাটাবেস স্কিমা:
ডাটাবেসে, Person টেবিলের মধ্যে passport_id নামে একটি ফিল্ড থাকবে, যা Passport টেবিলের id এর সাথে সম্পর্কিত থাকবে।
২. @OneToMany সম্পর্ক
@OneToMany সম্পর্ক ব্যবহৃত হয় যখন একটি Entity একাধিক Entity এর সাথে সম্পর্কিত থাকে। উদাহরণস্বরূপ, একটি Department Entity এর একাধিক Employee থাকতে পারে। এটি সাধারণত foreign key ব্যবহার করে একটি একক Entity কে একাধিক Entity এর সাথে সম্পর্কিত করে।
উদাহরণ:
ধরা যাক, Department এবং Employee Entity ক্লাসের মধ্যে একটি One-to-Many সম্পর্ক রয়েছে, যেখানে একটি ডিপার্টমেন্টে একাধিক কর্মচারী (Employee) থাকতে পারে।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Department {
@Id
private Long id;
private String name;
@OneToMany(mappedBy = "department")
private List<Employee> employees;
// getters and setters
}
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
public class Employee {
@Id
private Long id;
private String name;
@ManyToOne
private Department department;
// getters and setters
}
এখানে, Department Entity তে @OneToMany ব্যবহার করা হয়েছে, যা Employee Entity এর একাধিক অবজেক্টের সাথে সম্পর্ক স্থাপন করে। mappedBy অ্যাট্রিবিউটটি স্পষ্ট করে দেয় যে সম্পর্কটি কোন Entity ক্লাসের মধ্যে নির্ধারিত হবে (এখানে Employee ক্লাসে department ফিল্ডের মাধ্যমে সম্পর্ক স্থাপিত হয়েছে)।
ডাটাবেস স্কিমা:
ডাটাবেসে, Employee টেবিলে department_id নামে একটি ফিল্ড থাকবে, যা Department টেবিলের id এর সাথে সম্পর্কিত থাকবে।
৩. @ManyToMany সম্পর্ক
@ManyToMany সম্পর্ক ব্যবহৃত হয় যখন দুটি Entity একে অপরের সাথে একাধিক সম্পর্ক ভাগ করে। এই ধরনের সম্পর্ক সাধারণত join table ব্যবহার করে সম্পন্ন হয়। উদাহরণস্বরূপ, একটি Student Entity এর একাধিক Course থাকতে পারে এবং একটি Course এর একাধিক Student থাকতে পারে।
উদাহরণ:
ধরা যাক, Student এবং Course Entity ক্লাসের মধ্যে একটি Many-to-Many সম্পর্ক রয়েছে, যেখানে এক ছাত্রের একাধিক কোর্স থাকতে পারে এবং একটি কোর্সে একাধিক ছাত্র থাকতে পারে।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import java.util.List;
@Entity
public class Student {
@Id
private Long id;
private String name;
@ManyToMany
private List<Course> courses;
// getters and setters
}
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import java.util.List;
@Entity
public class Course {
@Id
private Long id;
private String name;
@ManyToMany(mappedBy = "courses")
private List<Student> students;
// getters and setters
}
এখানে, Student Entity তে @ManyToMany অ্যানোটেশন ব্যবহার করা হয়েছে, যা Course Entity এর একাধিক অবজেক্টের সাথে সম্পর্ক স্থাপন করে। mappedBy অ্যাট্রিবিউটটি নির্ধারণ করে যে এই সম্পর্কটি কোন Entity ক্লাসে প্রতিষ্ঠিত হবে (এখানে Student ক্লাসের courses ফিল্ডের মাধ্যমে সম্পর্ক স্থাপন হয়েছে)।
ডাটাবেস স্কিমা:
ডাটাবেসে, একটি join table তৈরি হবে যা student_id এবং course_id এর মাধ্যমে Student এবং Course টেবিলগুলির মধ্যে সম্পর্ক স্থাপন করবে।
সারাংশ
JPA-এর @OneToOne, @OneToMany, এবং @ManyToMany অ্যানোটেশনগুলি আপনাকে ডাটাবেস টেবিলগুলির মধ্যে সম্পর্ক সহজে তৈরি করতে সাহায্য করে।
- @OneToOne সম্পর্ক একটি Entity কে অন্য একটি Entity এর সাথে একক সম্পর্ক স্থাপন করতে ব্যবহৃত হয়।
- @OneToMany সম্পর্ক এক Entity কে একাধিক Entity এর সাথে সম্পর্কিত করতে ব্যবহৃত হয়।
- @ManyToMany সম্পর্ক দুইটি Entity কে একাধিক সম্পর্কের মাধ্যমে সংযুক্ত করতে ব্যবহৃত হয় এবং সাধারণত একটি join table ব্যবহার করা হয়।
এই অ্যানোটেশনগুলি ডাটাবেস স্কিমা ডিজাইনকে সহজ করে এবং জাভা অ্যাপ্লিকেশনে ডাটাবেস সম্পর্ক ব্যবস্থাপনায় আরও দক্ষতা আনতে সাহায্য করে।
Cascade এবং Fetch Type স্প্রিং বুট জেপিএ (JPA) এর গুরুত্বপূর্ণ কনফিগারেশন অপশন, যা ডেটাবেস সম্পর্কিত ক্লাসগুলোর মধ্যে সম্পর্ক স্থাপন এবং সম্পর্কিত ডেটা লোড করার সময় আচরণ নির্ধারণ করে। এটি ORM (Object-Relational Mapping) এর অংশ হিসেবে ডেটাবেস টেবিল এবং জাভা ক্লাসের মধ্যে সম্পর্ককে আরও পরিষ্কার এবং কার্যকরীভাবে পরিচালনা করতে সহায়তা করে।
Cascade
Cascade হল একটি কনসেপ্ট যা ব্যবহারকারীদের parent Entity-এর উপর কার্যকরী CRUD অপারেশনগুলি child Entity গুলিতে স্বয়ংক্রিয়ভাবে প্রয়োগ করতে সহায়তা করে। এটি একাধিক Entity-এর মধ্যে সম্পর্কের সাথে কাজ করতে ব্যবহৃত হয়।
স্প্রিং বুট JPA তে Cascade অপশন ব্যবহার করা হয় যখন একটি Entity আরেকটি Entity এর উপর নির্ভরশীল হয় এবং আপনি চান যে parent Entity-এ পরিবর্তন হলে তার child Entity তেও একই পরিবর্তন আসবে।
Cascade Types
JPA-তে CascadeType এর কিছু সাধারণ অপশন রয়েছে, যেমন:
- CascadeType.ALL: সব ধরনের Cascade অপারেশন (Persist, Merge, Remove, Refresh, Detach) প্রয়োগ হবে।
- CascadeType.PERSIST: যখন parent Entity সেভ হবে, তখন child Entity গুলি সেভ হবে।
- CascadeType.MERGE: যখন parent Entity মর্জ হবে, তখন child Entity গুলিও মর্জ হবে।
- CascadeType.REMOVE: যখন parent Entity ডিলিট হবে, তখন child Entity গুলি ডিলিট হবে।
- CascadeType.REFRESH: parent Entity রিফ্রেশ হলে child Entity গুলি রিফ্রেশ হবে।
- CascadeType.DETACH: যখন parent Entity ডিসঅ্যাসোসিয়েট হবে, তখন child Entity গুলি ডিসঅ্যাসোসিয়েট হবে।
Cascade এর কনফিগারেশন উদাহরণ
ধরা যাক, আপনার একটি Order Entity এবং একটি Product Entity রয়েছে, যেখানে একটি Order অনেক Product এর সাথে সম্পর্কিত (One-to-Many Relationship)। এখানে আমরা CascadeType.ALL ব্যবহার করব, যাতে Order Entity সেভ বা ডিলিট হলে, সাথে সংশ্লিষ্ট Product গুলিও সেভ বা ডিলিট হয়।
1. CascadeType.ALL উদাহরণ
import javax.persistence.*;
import java.util.List;
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String orderNumber;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "order")
private List<Product> products;
// Getters and Setters
}
import javax.persistence.*;
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "order_id")
private Order order;
// Getters and Setters
}
ব্যাখ্যা:
এখানে, Order Entity একটি One-to-Many সম্পর্ক স্থাপন করেছে Product Entity এর সাথে এবং cascade = CascadeType.ALL ব্যবহার করা হয়েছে। এর ফলে যখন Order Entity সেভ বা ডিলিট হবে, তখন সংশ্লিষ্ট Product গুলিও স্বয়ংক্রিয়ভাবে সেভ বা ডিলিট হবে।
Fetch Type
FetchType একটি কনফিগারেশন যা সম্পর্কিত Entity-এর ডেটা লোড করার আচরণ নির্ধারণ করে। সাধারণত দুটি FetchType আছে:
- FetchType.LAZY: এটি ডিফল্ট মুড, যার মাধ্যমে সম্পর্কিত ডেটা শুধুমাত্র প্রয়োজন হলে (ডেলিগেট বা ব্যবহার করার সময়) লোড হয়।
- FetchType.EAGER: এটি সম্পর্কিত সমস্ত ডেটা একবারে লোড করে, অর্থাৎ যখন মূল Entity লোড হবে তখন তার সম্পর্কিত সকল Entity-ও একসাথে লোড হবে।
FetchType এর কনফিগারেশন উদাহরণ
1. FetchType.LAZY উদাহরণ
import javax.persistence.*;
import java.util.List;
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String orderNumber;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "order")
private List<Product> products;
// Getters and Setters
}
ব্যাখ্যা:
এখানে @OneToMany(fetch = FetchType.LAZY) ব্যবহার করা হয়েছে, যার মাধ্যমে Order Entity এর সাথে সম্পর্কিত Product গুলি তখনই লোড হবে, যখন আপনি সেগুলিকে এক্সেস করবেন (লেজি লোডিং)।
2. FetchType.EAGER উদাহরণ
import javax.persistence.*;
import java.util.List;
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String orderNumber;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "order")
private List<Product> products;
// Getters and Setters
}
ব্যাখ্যা:
এখানে @OneToMany(fetch = FetchType.EAGER) ব্যবহার করা হয়েছে, যার মাধ্যমে যখন Order Entity লোড হবে, তখন তার সাথে সম্পর্কিত Product গুলোও একসাথে লোড হবে (ইগার লোডিং)।
Cascade এবং FetchType একসাথে ব্যবহার
এখন, আপনি চাইলে Cascade এবং FetchType একসাথে ব্যবহার করতে পারেন। এর মাধ্যমে আপনি ডেটা লোড এবং সম্পর্কিত Entity-গুলোর উপর CRUD অপারেশন একই সাথে কনফিগার করতে পারবেন।
1. Cascade এবং FetchType একসাথে উদাহরণ
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String orderNumber;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "order")
private List<Product> products;
// Getters and Setters
}
ব্যাখ্যা:
এখানে CascadeType.ALL এবং FetchType.LAZY একসাথে ব্যবহৃত হয়েছে। এর মাধ্যমে Order Entity সেভ হলে তার সম্পর্কিত Product গুলিও সেভ হবে, কিন্তু Product গুলি শুধুমাত্র তখনই লোড হবে যখন আপনি সেগুলি এক্সেস করবেন (লেজি লোডিং)।
উপসংহার
Cascade এবং FetchType স্প্রিং বুট JPA-তে গুরুত্বপূর্ণ কনফিগারেশন অপশন, যা Entity সম্পর্কিত ডেটাবেস টেবিলগুলির CRUD অপারেশন এবং ডেটা লোডিং আচরণ নিয়ন্ত্রণ করে। Cascade ব্যবহার করলে আপনি সম্পর্কিত Entity-এর উপর CRUD অপারেশন স্বয়ংক্রিয়ভাবে প্রয়োগ করতে পারেন এবং FetchType ব্যবহারের মাধ্যমে আপনি ডেটা লোডিং আচরণ নিয়ন্ত্রণ করতে পারেন। এই কনফিগারেশনগুলির মাধ্যমে আপনার ডেটাবেস সম্পর্ক এবং ডেটা প্রসেসিং আরও কার্যকরী ও নমনীয় হয়।
Entity Relationship Mapping (ERM) হল একটি গুরুত্বপূর্ণ ধারণা যা Java Persistence API (JPA)-তে ডাটাবেস টেবিলের মধ্যে সম্পর্ককে মডেল করে। এটি জাভা অবজেক্ট এবং ডাটাবেস টেবিলের মধ্যে সম্পর্ক স্থাপন করে, যেমন One-to-One, One-to-Many, Many-to-One, এবং Many-to-Many সম্পর্ক।
Spring Boot JPA এর মাধ্যমে, আমরা JPA অ্যানোটেশন ব্যবহার করে এই সম্পর্কগুলো মডেল করতে পারি। এই সম্পর্কগুলো ডাটাবেসের টেবিলগুলির মধ্যে অবজেক্টের মধ্যকার সম্পর্ক নির্দেশ করে এবং Spring Boot JPA সহজেই এই সম্পর্কগুলো ম্যানেজ করতে সহায়তা করে।
Entity Relationship Mapping: বিভিন্ন সম্পর্ক
1. One-to-One Relationship
One-to-One সম্পর্ক হল এমন একটি সম্পর্ক যেখানে একটি Entity অন্য একটি Entity এর সাথে একে অপরের সাথে সম্পর্কিত থাকে। এক Entity-এর একটি রেকর্ড অন্য Entity-এর একটি রেকর্ডের সাথে সম্পর্কিত।
উদাহরণ: One-to-One Relationship
ধরা যাক, একটি Person Entity এবং একটি Passport Entity রয়েছে, যেখানে একজন ব্যক্তির একটি Passport রয়েছে।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity
public class Person {
@Id
private Long id;
private String name;
@OneToOne
private Passport passport;
// Getter এবং Setter
}
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Passport {
@Id
private Long id;
private String passportNumber;
// Getter এবং Setter
}
এখানে, Person Entity-এর passport প্রপার্টি একটি One-to-One সম্পর্ক নির্দেশ করছে যেখানে একটি Person এর একটি Passport থাকে।
2. One-to-Many Relationship
One-to-Many সম্পর্ক হল এমন একটি সম্পর্ক যেখানে একটি Entity একাধিক Entity-র সাথে সম্পর্কিত থাকে। সাধারণত, এক Entity এর একটি রেকর্ড অন্য Entity এর অনেক রেকর্ডের সাথে সম্পর্কিত।
উদাহরণ: One-to-Many Relationship
ধরা যাক, একটি Department Entity এবং একটি Employee Entity রয়েছে, যেখানে একটি Department অনেক Employee কে ধারণ করে।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Department {
@Id
private Long id;
private String name;
@OneToMany(mappedBy = "department")
private List<Employee> employees;
// Getter এবং Setter
}
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
public class Employee {
@Id
private Long id;
private String name;
@ManyToOne
private Department department;
// Getter এবং Setter
}
এখানে, Department Entity-তে One-to-Many সম্পর্ক ব্যবহার করা হয়েছে, যেখানে একটি Department অনেক Employee কে ধারণ করে।
3. Many-to-One Relationship
Many-to-One সম্পর্ক হল এমন একটি সম্পর্ক যেখানে অনেক Entity একটি Entity এর সাথে সম্পর্কিত থাকে। অর্থাৎ, একাধিক রেকর্ড একক রেকর্ডের সাথে সম্পর্কিত থাকে।
উদাহরণ: Many-to-One Relationship
উপরের Employee এবং Department সম্পর্কের উল্টো, Many-to-One সম্পর্ক নির্দেশ করার জন্য Employee Entity তে @ManyToOne অ্যানোটেশন ব্যবহার করা হয়েছে, এবং Department Entity তে @OneToMany অ্যানোটেশন ব্যবহার করা হয়েছে।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
public class Employee {
@Id
private Long id;
private String name;
@ManyToOne
private Department department;
// Getter এবং Setter
}
এখানে, Employee Entity-তে Many-to-One সম্পর্ক ব্যবহার করা হয়েছে, যেখানে একাধিক Employee একটি Department এর সাথে সম্পর্কিত।
4. Many-to-Many Relationship
Many-to-Many সম্পর্ক হল এমন একটি সম্পর্ক যেখানে একাধিক Entity একাধিক Entity-র সাথে সম্পর্কিত থাকে। একটি Entity-এর একাধিক রেকর্ড অন্য Entity-এর একাধিক রেকর্ডের সাথে সম্পর্কিত।
উদাহরণ: Many-to-Many Relationship
ধরা যাক, একটি Student Entity এবং একটি Course Entity রয়েছে, যেখানে একটি Student একাধিক Course এ ভর্তি হতে পারে এবং একটি Course-এ একাধিক Student থাকতে পারে।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
@Entity
public class Student {
@Id
private Long id;
private String name;
@ManyToMany(mappedBy = "students")
private List<Course> courses;
// Getter এবং Setter
}
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
@Entity
public class Course {
@Id
private Long id;
private String courseName;
@ManyToMany
private List<Student> students;
// Getter এবং Setter
}
এখানে, Student এবং Course Entity-তে Many-to-Many সম্পর্ক ব্যবহার করা হয়েছে, যেখানে একটি Student একাধিক Course তে ভর্তি হতে পারে এবং একটি Course তে একাধিক Student থাকতে পারে।
@JoinColumn এবং @JoinTable অ্যানোটেশন
@JoinColumn এবং @JoinTable অ্যানোটেশন ব্যবহার করা হয় জটিল সম্পর্কগুলির মধ্যে ডাটাবেস টেবিলের কলাম সম্পর্কিত করার জন্য।
- @JoinColumn: এটি সাধারণত Many-to-One এবং One-to-One সম্পর্কের ক্ষেত্রে ব্যবহৃত হয়, যেখানে দুইটি Entity একে অপরের সাথে সম্পর্কিত থাকে।
- @JoinTable: এটি Many-to-Many সম্পর্কের ক্ষেত্রে ব্যবহৃত হয়, যেখানে একটি অ্যাসোসিয়েটিং টেবিল তৈরি করা হয়, যা দুইটি Entity এর মধ্যে সম্পর্ক স্থাপন করে।
উদাহরণ: @JoinColumn ব্যবহার করা (Many-to-One)
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
@Entity
public class Employee {
@Id
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
// Getter এবং Setter
}
এখানে, @JoinColumn(name = "department_id") ব্যবহার করা হয়েছে, যা Employee টেবিলের মধ্যে department_id কলামটি নির্ধারণ করে।
উদাহরণ: @JoinTable ব্যবহার করা (Many-to-Many)
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
@Entity
public class Student {
@Id
private Long id;
private String name;
@ManyToMany
@JoinTable(
name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id")
)
private List<Course> courses;
// Getter এবং Setter
}
এখানে, @JoinTable ব্যবহার করা হয়েছে একটি student_course টেবিল তৈরি করার জন্য, যা Student এবং Course Entity এর মধ্যে সম্পর্ক স্থাপন করে।
Conclusion
Entity Relationship Mapping (ERM) Spring Boot JPA-তে একটি গুরুত্বপূর্ণ ধারণা, যা ডাটাবেসের মধ্যে সম্পর্কিত টেবিলের মধ্যে অবজেক্টের সম্পর্ক স্থাপন করতে সহায়তা করে। @Entity, @Table, @Id, @Column, @OneToOne, @OneToMany, @ManyToOne, এবং @ManyToMany অ্যানোটেশনগুলি ব্যবহৃত হয় Spring Boot JPA-তে Entity সম্পর্ক নির্ধারণ করতে।
এই অ্যানোটেশনগুলির মাধ্যমে JPA ডাটাবেসের টেবিলগুলির মধ্যে সম্পর্ক স্থাপন করা যায় এবং ডাটাবেস অপারেশনগুলি আরও সহজ, পরিষ্কার এবং কার্যকরী হয়।
Read more